package com.amado.course48Generics;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//下界类型通配符：set方法受限
public class PageExtends<T extends Map> {
	/**
	 * 一页展示多少条数据
	 */
	private int pageSize = 3;
	/**
	 * 当前页
	 */
	private int currentPage = 1;
	/**
	 * 一共有多少页
	 */
	private int totalPage;
	/**
	 * 总共数据条数
	 */
	private int count;

	/**
	 * 返回的列表数据
	 */
	private List<T> list;

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		// 统计有多少页
		totalPage = count / pageSize + (count % pageSize == 0 ? 0 : 1);
		this.count = count;
	}

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}

	public PageExtends() {

	}

	public PageExtends(int currentPage, int pageSize) {
		super();
		this.currentPage = currentPage;
		this.pageSize = pageSize;
	}

	public static void main(String[] args) {
		/*//
		List<? extends Number> eList = new ArrayList<>();
		Number numObject = eList.get(0); // 语句1，正确
//		语句1：List<? extends Number>eList存放Number及其子类的对象，语句1取出Number（或者Number子类）对象直接赋值给Number类型的变量是符合java规范的。 
		Integer intObject = eList.get(0); // 语句2，错误
//		语句2：List<? extends Number>eList存放Number及其子类的对象，语句2取出Number（或者Number子类）对象直接赋值给Integer类型（Number子类）的变量是不符合java规范的。 

//		语句3：List<? extends Number>eList不能够确定实例化对象的具体类型，因此无法add具体对象至列表中，可能的实例化对象如下。
		eList.add(new Integer(1)); // 语句3，错误*/
	}
	// 只能传List<Number接口>，或List<接口的子类>
	void getList1(List<? extends Number> list) {
		Number obj = list.get(0);
//		list.add(new Long(1));
		return;
	}

	void getList2(List<? super Number> list) {
		Object obj = list.get(0);
		list.add(new Long(1));
//		list.add("a");
		return;
	}
	void list() {
		List<Number> list1 = new ArrayList<>();
		List<Integer> list2 = new ArrayList<>();
		getList1(list1);
		getList1(list2);
		getList2(list1);
//		getList2(list2);
	}
}
